# 导入所需的依赖
import asyncio

from langchain.memory import ConversationBufferMemory
from langchain_core.tools import tool
from langchain_milvus import Milvus
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.tools import TavilySearchResults, MoveFileTool
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.prompts import ChatPromptTemplate
from langchain_chroma import Chroma

from dotenv import load_dotenv
import os
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.tools import tool
from openai import OpenAI
import base64

from app.services.rag_query_service import RAGQueryException

# 加载环境变量
load_dotenv()
class IntelligentAgent:
    #初始化智能体自身的组件
    def __init__(self):
        '''初始化智能体'''
        self._setup_environment()
        self.chat_model = self._init_chat_model()
        self.tools=self._init_tools()
        self.prompt=self._create_prompt()
        self.agent=self._create_agent()
        self.agent_executor=self._create_agent_executor()
        self.agent_executor.run(input="请使用中文回答我的问题")
        self.stor={}



    #初始化环境
    def _setup_environment(self):
        os.environ["TAVILY_API_KEY"] = "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"
    #初始化聊天模型
    def _init_chat_model(self):
        return  ChatOpenAI(
            model="deepseek-chat",
            temperature=0.3,
            api_key=os.getenv("DEEPSEEK_API_KEY"),
            base_url="https://api.deepseek.com/v1"
        )

    def _create_filesystem_tool(self):
        """创建文件系统工具"""

        @tool
        def filesystem_tool(query: str) -> str:
            """
            用于感知和操作当前文件系统环境的工具
            可以列出目录内容、读取文件、获取文件信息等
            """
            try:
                if query.startswith("list_dir:"):
                    # 列出目录内容
                    directory = query.split(":", 1)[1].strip()
                    if not directory:
                        directory = "."
                    files = os.listdir(directory)
                    return f"目录 {directory} 中的文件和文件夹:\n" + "\n".join(files)

                elif query.startswith("read_file:"):
                    # 读取文件内容
                    file_path = query.split(":", 1)[1].strip()
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()
                    return f"文件 {file_path} 的内容:\n{content[:1000]}..."

                elif query.startswith("get_cwd:"):
                    # 获取当前工作目录
                    return f"当前工作目录: {os.getcwd()}"

                else:
                    return "不支持的操作。请使用以下格式之一:\n- list_dir:<目录路径>\n- read_file:<文件路径>\n- get_cwd:"
            except Exception as e:
                return f"操作失败: {str(e)}"

        return filesystem_tool
    #创建Rag向量集检索
    def _init_rag_vector_store(self):
        '''创建向量检索工具'''

    #初始化工具集
    def _init_tools(self):
        '''初始化工具'''
        #天气查询工具
        weather_search = TavilySearchResults(
            name="weather_search",
            description="用于查询天气信息，包括当前天气、温度、湿度、风力等",
            max_results=1
        )
        #车票查询工具
        ticket_search = TavilySearchResults(
            name="ticket_search",
            description="用于查询车票信息，包括火车票、汽车票、飞机票等交通票务信息",
            max_results=3
        )
        #文件系统检索工具
        filesystem_tool = self._create_filesystem_tool()
        return [weather_search, ticket_search, filesystem_tool]
        #RAG检索工具
    def _create_document_retriever_tool(self):
            pass
        #创建提示词模板
    def _create_prompt(self):
            return ChatPromptTemplate.from_messages([
                ("system", """你是一个智能助手，能够准确识别用户问题的类型并调用相应工具。请严格按照以下规则分类问题调用相应的工具：
                       1. weather_search: 天气查询 - 涉及天气、温度、湿度、风力等气象信息的问题，调用工具时必须包含明确的城市名称
                       2. ticket_search: 车票查询 - 涉及火车票、汽车票、飞机票等交通票务信息的问题
                       3. _create_document_retriever_tool: 文档检索 - 涉及用户提问公考方面的知识，优先检索向量库里有的内容
                       4. filesystem_tool: 文件系统操作 - 涉及查看目录内容、读取文件、获取环境信息等问题
                       5. Movefiletools:  文件系统操作 - 具有查看本机的文件内容并且具有移动文件重命名文件的权限
                       用户提出问题你判断需要使用的工具，其他问题根据你的知识库来回答"""),
                ("placeholder", "{chat_history}"),
                ("human", "{input}"),
                ("placeholder", "{agent_scratchpad}")
            ])
        #创建智能体
    def _create_agent(self):
            '''创建Agent'''
            return create_tool_calling_agent(
                tools=self.tools,
                llm=self.chat_model,
                prompt=self._create_prompt(),
                verbose=True,
                max_iterations=3,
                max_execution_time=60,
                early_stopping_method="generate"
            )
        #创建智能体执行器
    def _create_agent_executor(self):
            '''创建Agent执行器'''
            #记忆组件
            summary_memory=ConversationBufferMemory(
                memory_key="chat_history",
                input_key="input",
                output_key="output",
                llm=self.chat_model
            )
            return AgentExecutor(
                agent=self._create_agent(),
                tools=self.tools,
                verbose=True,
                memory=summary_memory,
                max_iterations=3,
                max_execution_time=60,
                early_stopping_method="generate"
            )
        #获取会话历史
    def get_session_history(self,session_id:str):
            '''获取会话历史'''
            #判断此次会话是否是历史会话
            if session_id not in self.store:
                self.store[session_id] = ChatMessageHistory()
            return self.store[session_id]

    def run_agent(self):
            """运行智能体"""
            print("智能助手已启动！我可以帮您：")
            print("1. 查询天气（例如：今天北京的天气怎么样？）")
            print("2. 查询车票（例如：查询从北京到上海的火车票）")
            print("3. 查找文档内容（例如：我的文档中关于人工智能的内容有哪些？）")
            print("输入 'quit' 退出程序\n")

            while True:
                user_input = input("请输入您的问题: ")
                if user_input.lower() == 'quit':
                    break
                try:
                    response = self.agent_executor.invoke({"input": user_input})
                    print(f"助手回答: {response['output']}\n")
                except Exception as e:
                    print(f"出现错误: {str(e)}\n")

# 主函数
if __name__ == "__main__":
            agent = IntelligentAgent()
            print("智能体创建完成！")
            agent.run_agent()

